home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / micq-0.4.0 / ui.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  33KB  |  1,062 lines

  1. /*********************************************
  2. **********************************************
  3. This file has the "ui" functions that read input
  4. and send messages etc.
  5.  
  6. This software is provided AS IS to be used in
  7. whatever way you see fit and is placed in the
  8. public domain.
  9.  
  10. Author : Matthew Smith April 23, 1998
  11. Contributors : Nicolas Sahlqvist April 27, 1998
  12.                Michael Ivey May 4, 1998
  13.                Ulf Hedlund -- Windows Support
  14.                Michael Holzt May 5, 1998
  15. Changes :
  16. 22-6-98 Added the save and alter command and the
  17.         new implementation of auto
  18. **********************************************
  19. **********************************************/
  20.  
  21. #include "micq.h"
  22. #include "datatype.h"
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #ifdef _WIN32
  26.   #include <winsock2.h>
  27. #else
  28.   #include <unistd.h>
  29.   #include <netinet/in.h>
  30.   #include <sys/types.h>
  31.   #include <sys/stat.h>
  32.   #include <sys/time.h>
  33.   #include <sys/socket.h>
  34.   #include <arpa/inet.h>
  35.   #include <netdb.h>
  36.   #include "mreadline.h"
  37. #endif
  38. #include <fcntl.h>
  39. #include <time.h>
  40. #include <stdarg.h>
  41. #include <string.h>
  42. #include <ctype.h>
  43. #include <assert.h>
  44. #include "ui.h"
  45. #ifdef __SASC
  46. #include "amiga-dt.h"
  47. #endif
  48.  
  49. USER_INFO_STRUCT user;
  50.  
  51. #ifdef UNIX
  52. char *strdup( const char * );
  53. int strcasecmp( const char *, const char * );
  54. #endif
  55.  
  56. BOOL Do_Multiline( SOK_T sok, char *buf )
  57. {
  58.    static int offset=0;
  59.    static char msg[1024];
  60.    
  61.    msg[ offset ] = 0;
  62.    if ( strcmp( buf, END_MSG_STR ) == 0 )
  63.    {
  64.       icq_sendmsg( sok, multi_uin, msg, NORM_MESS );
  65.       M_print( MESSAGE_SENT_1_STR );
  66.       Print_UIN_Name( multi_uin );
  67.       M_print( MESSAGE_SENT_2_STR );
  68.       last_uin = multi_uin;
  69.       offset = 0;
  70.       return FALSE;
  71.    }
  72.    else if ( strcmp( buf, CANCEL_MSG_STR ) == 0 )
  73.    {
  74.       M_print( MESSAGE_CANCELED_STR );
  75.       last_uin = multi_uin;
  76.       offset = 0;
  77.       return FALSE;
  78.    }
  79.    else
  80.    {
  81.       if ( offset + strlen( buf ) < 450 )
  82.       {
  83.          strcat( msg, buf );
  84.          strcat( msg, "\r\n" );
  85.          offset += strlen( buf ) + 2;
  86.          return TRUE;
  87.       }
  88.       else
  89.       {
  90.          M_print( MESSAGE_BUFFER_FULL_STR );
  91.          M_print( MESSAGE_SENT_1_STR );
  92.          Print_UIN_Name( multi_uin );
  93.          M_print( MESSAGE_SENT_2_STR );
  94.          icq_sendmsg( sok, multi_uin, msg, NORM_MESS );
  95.          last_uin = multi_uin;
  96.          offset = 0;
  97.          return FALSE;
  98.       }
  99.    }
  100. }
  101.  
  102. void Info_Update( SOK_T sok, char *buf )
  103. {
  104.  
  105.    switch ( status ) {
  106.    case NEW_NICK:
  107.       user.nick = strdup( (char *) buf );
  108.        M_print ( FIRST_NAME_UPDATE_STR );
  109.       status++;
  110.       break;
  111.    case NEW_FIRST:
  112.       user.first = strdup( (char *) buf );
  113.        M_print ( LAST_NAME_UPDATE_STR );
  114.       status++;
  115.       break;
  116.    case NEW_LAST:
  117.       user.last = strdup( (char *) buf );
  118.        M_print ( EMAIL_UPDATE_STR );
  119.       status++;
  120.       break;
  121.    case NEW_EMAIL:
  122.       user.email = strdup( (char *) buf );
  123.        M_print( AUTH_QUESTION_STR );
  124.       status++;
  125.       break;
  126.    case NEW_AUTH:
  127.       if ( ! strcasecmp( buf, NO_STR ) )
  128.       {
  129.          user.auth = FALSE;
  130.          Update_User_Info( sok, &user );
  131. /*         free( user.nick );
  132.          free( user.last );
  133.          free( user.first );
  134.          free( user.email ); */
  135.          status = 0;
  136.       }
  137.       else if ( ! strcasecmp( buf, YES_STR ) )
  138.       {
  139.          user.auth = TRUE;
  140.          Update_User_Info( sok, &user );
  141.          free( user.nick );
  142.          free( user.last );
  143.          free( user.first );
  144.          free( user.email );
  145.          status = 0;
  146.       }
  147.       else
  148.       {
  149.          M_print( YESNO_RESPONSE_STR );
  150.           M_print( AUTH_QUESTION_STR );
  151.       }
  152.       break;
  153.    }
  154. }
  155.  
  156. void User_Search( SOK_T sok, char *buf )
  157. {
  158.     switch (status) {
  159.     case SRCH_START:
  160.         M_print ( "Enter the Users E-mail address : ");
  161.         status++;
  162.     break;
  163.     case SRCH_EMAIL:
  164.         user.email = strdup( (char *) buf );
  165.         M_print( "Enter the Users Nick : ");
  166.         status++;
  167.     break;
  168.     case SRCH_NICK:
  169.         user.nick = strdup( (char *) buf );
  170.         M_print ( "Enter The Users First Name : ");
  171.         status++;
  172.     break;
  173.     case SRCH_FIRST:
  174.         user.first = strdup( (char *) buf );
  175.         M_print ( "Enter The Users Last Name : ");
  176.         status++;
  177.     break;
  178.     case SRCH_LAST:
  179.         user.last = strdup( (char *) buf );
  180.         start_search( sok, user.email, user.nick, 
  181.                 user.first, user.last );
  182.         status = 0;
  183.     break;
  184.     }
  185. }
  186.  
  187. BOOL Do_Multiline_All( SOK_T sok, char *buf )
  188. {
  189.    static int offset=0;
  190.    static char msg[1024];
  191.    char * temp;
  192.    int i;
  193.    
  194.    msg[ offset ] = 0;
  195.    if ( strcmp( buf, END_MSG_STR ) == 0 )
  196.    {
  197.       for ( i=0; i < Num_Contacts; i++ ) {
  198.          temp = strdup ( msg );
  199.          icq_sendmsg( sok, Contacts[i].uin, temp, MRNORM_MESS );
  200.      free( temp );
  201.       }
  202.       M_print( "Message sent!" );
  203.       offset = 0;
  204.       return FALSE;
  205.    }
  206.    else if ( strcmp( buf, CANCEL_MSG_STR ) == 0 )
  207.    {
  208.       M_print( MESSAGE_CANCELED_STR );
  209.       offset = 0;
  210.       return FALSE;
  211.    }
  212.    else
  213.    {
  214.       if ( offset + strlen( buf ) < 450 )
  215.       {
  216.          strcat( msg, buf );
  217.          strcat( msg, "\r\n" );
  218.          offset += strlen( buf ) + 2;
  219.          return TRUE;
  220.       }
  221.       else
  222.       {
  223.          M_print( MESSAGE_BUFFER_FULL_STR );
  224.          for ( i=0; i < Num_Contacts; i++ ) {
  225.         temp = strdup( msg );
  226.             icq_sendmsg( sok, Contacts[i].uin, temp, MRNORM_MESS );
  227.         free( temp );
  228.      }
  229.          offset = 0;
  230.          return FALSE;
  231.       }
  232.    }
  233. }
  234.  
  235. /******************************************************
  236. Read a line of input and processes it.
  237. *******************************************************/
  238. void Get_Input( SOK_T sok )
  239. {
  240.    char buf[1024]; /* This is hopefully enough */
  241.    char *cmd;
  242.    char *arg1;
  243.    char *arg2;
  244.    int i;
  245.    
  246.    memset( buf, 0, 1024 );
  247.    R_getline( buf, 1024 );
  248.    buf[1023]=0; /* be safe */
  249.    if ( status == 1 )
  250.    {
  251.       if ( ! Do_Multiline( sok, buf ) )
  252.       {
  253.          status = 2;
  254.       } else {
  255.        R_doprompt ( MSG_PROMPT_STR );
  256.        }
  257.    }
  258.    else if ( status == 3 )
  259.    {
  260.       if ( ! Do_Multiline_All( sok, buf ) ) {
  261.          status = 2;
  262.       } else {
  263.           R_doprompt ( MSGA_PROMPT_STR );
  264.        }
  265.    }
  266.    else if ( ( status >= NEW_NICK) && ( status <= NEW_AUTH) )
  267.    {  Info_Update( sok, buf ); }
  268.    else if ( ( status >= SRCH_START) && ( status <= SRCH_LAST) )
  269.    { User_Search( sok, buf ); }
  270.    else
  271.    {
  272.       if ( buf[0] != 0 )
  273.       {
  274.         if ( '!' == buf[0] )
  275.         {
  276.        R_pause ();
  277.        system( &buf[1] );
  278.        R_resume ();
  279.            Prompt();
  280.            return;
  281.         }
  282.          cmd = strtok( buf, " \n\t" );
  283.         if ( NULL == cmd )
  284.         {
  285.            Prompt();
  286.            return;
  287.         }
  288.          /* goto's removed and code fixed by Paul Laufer. Enjoy! */
  289.          if ( ( strcasecmp( cmd , "quit" ) == 0 ) ||
  290.               ( strcasecmp( cmd , "/quit" ) == 0 ) )
  291.             {  Quit = TRUE; }
  292.          else if ( strcasecmp( cmd, quit_cmd ) == 0 )
  293.             {  Quit = TRUE; }
  294.          else if ( strcasecmp( cmd, sound_cmd ) == 0 )
  295.          {
  296.             if ( SOUND_ON == Sound )
  297.             {
  298.                Sound = SOUND_OFF;
  299.                M_print( "Sound" SERVCOL " OFF" NOCOL ".\n" );
  300.             }
  301.             else if ( SOUND_OFF == Sound )
  302.             {
  303.                Sound = SOUND_ON;
  304.                M_print( "Sound" SERVCOL  " ON" NOCOL ".\n" );
  305.             }
  306.          }
  307.          else if ( strcasecmp( cmd, change_cmd ) == 0 )
  308.             {  Change_Function( sok ); }
  309.          else if ( strcasecmp( cmd, rand_cmd ) == 0 )
  310.             {  Random_Function( sok ); }
  311.          else if ( strcasecmp( cmd, "set" ) == 0 )
  312.             {  Random_Set_Function( sok ); }
  313.             else if ( ! strcasecmp( cmd, color_cmd ) )
  314.             { 
  315.                Color = !Color;
  316.                if ( Color )
  317.                {
  318. #ifdef FUNNY_MSGS
  319.                   M_print( SERVCOL "Being " MESSCOL "all " CLIENTCOL
  320.           "colorful " NOCOL
  321.           "and " SERVCOL "cute " CONTACTCOL "now\n" NOCOL );
  322. #else
  323.                    M_print( "Color is " MESSCOL "on" NOCOL ".\n" );
  324. #endif
  325.                }
  326.                else
  327.                {
  328. #ifdef FUNNY_MSGS
  329.                   M_print( SERVCOL "Dull colorless mode on, resistance is futile\n" NOCOL );
  330. #else
  331.                    M_print( "Color is " MESSCOL "off" NOCOL ".\n" );
  332.